package cn.xiaolang.spring.demo;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Properties;

import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.ResourceUtils;

/**
 * spring中常用的工具类特性
 *
 * @author fuhw
 * @version 1.0
 */
public class ResourceRelateCharacters {


    /**
     * Spring中copy文件常用的方法FileCopyUtils
     *
     * @author fuhw
     */
    @Test
    public void testCopyFile() {
        try {
            Resource res = new ClassPathResource("/log4j.properties");
            // 1 将文件内容拷贝到一个 byte[] 中
            byte[] fileData = FileCopyUtils.copyToByteArray(res.getFile());
            System.err.println("将文件内容拷贝到一个 byte[] 中:" + Arrays.asList(fileData).toString());
            // 2 将文件内容拷贝到一个 String 中
            String fileStr = FileCopyUtils.copyToString(new FileReader(res.getFile()));
            System.err.println("FileCopyUtils to string : " + fileStr);
            // 3 将文件内容拷贝到另一个目标文件
            FileCopyUtils.copy(res.getFile(), new File(res.getFile().getParent() + "/log4j.properties"));
            // 4 将文件内容拷贝到一个输出流中
            OutputStream os = new ByteArrayOutputStream();
            FileCopyUtils.copy(res.getInputStream(), os);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * spring中读取文件的几个常用方法
     *
     * @author fuhw
     */
    @Test
    public void testResource() {
        try {

            /**加载所有类路径下的指定文件文件*/
            System.err.println("***********Spring-core-PropertiesLoaderUtils**************************");
            Properties loadAllProperties = PropertiesLoaderUtils.loadAllProperties("wx_app.properties");
            System.out.println("加载的类路径下的指定文件【wx_app.properties】中的值：" + loadAllProperties.getProperty("bxj.appId"));

            String filePath = "E:/sts-workspace/rangers_collect_practice/src/main/resources/wx_app.properties";
            Resource res1 = new FileSystemResource(filePath);
            Resource res2 = new ClassPathResource("/wx_app.properties");
            InputStream resInput1 = res1.getInputStream();
            InputStream resInput2 = res2.getInputStream();

            System.out.println();
            System.err.println("***********Spring-core-FileSystemResouce**************************");
            System.err.println("res1:" + res1.getFilename());
            readStream(resInput1);

            System.out.println();
            System.err.println("***********Spring-core-ClassPathResource**************************");

            System.err.println("res2:" + res2.getFilename());
            readStream(resInput2);

            System.out.println();
            System.err.println("***********Spring-util-ResourceUtils**************************");
            File clsFile = ResourceUtils.getFile("classpath:log4j.properties");
            System.out.println("get from classpath :" + clsFile.isFile());
            String httpFilePath = "file:E:/sts-workspace/rangers_collect_practice/src/main/resources/log4j.properties";
            File httpFile = ResourceUtils.getFile(httpFilePath);
            System.out.println("get from file path :" + httpFile.isFile());


        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 　字节读取流文件内容
     *
     * @param inputStream
     * @author fuhw
     */
    public void readStream(InputStream inputStream) {
        try {
            System.out.println("以字节为单位读取文件内容，一次读多个字节：");
            byte[] tempbytes = new byte[100];
            int byteread = 0;
            // 读入多个字节到字节数组中，byteread为一次读入的字节数
            while ((byteread = inputStream.read(tempbytes)) != -1) {
                System.out.write(tempbytes, 0, byteread);// 好方法，第一个参数是数组，第二个参数是开始位置，第三个参数是长度
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
